<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
// 函数扩展（箭头函数）

// * 参数默认值
// * rest参数  ...args
// * 扩展运算符（rest参数的逆运用）...
// * 箭头函数  
// * 尾调用  

// es6允许使用箭头来表示函数  =>  箭头函数  规范：不加小括号 一个参数   需要小括号 不需要参数及多个参数时

// 命名函数
// function arrow(v) {
//     return  10*v
// }


// 匿名函数
// let arrow = function (v) {
//     return  10*v
// }

// let arrow = v => 10*v

// console.log(arrow(10));


// setTimeout(() => {
//     console.log("hello ");
// }, 1000);

// var  obj ={
//     name:"tom",
//     age:20
// }

// setTimeout(function () {
//     console.log(obj.age);
// }, 1000);

// 箭头函数中this指向问题

var  lives = 100;

const cat = {
    lives: 9,
    // this指向window  箭头函数中的this 指向外层上下文绑定的this
    // jumps:()=>{
    //     return  this.lives-- ;
    // }
    // ++  --  在前 先自增或者自减 然后赋值给表达式   在后  先赋值给表达式   然后自己在自增或自减少
    jumps:function ()  {
        return  this.lives--;
    }
}

// console.log(cat.jumps());

var age = 10;
let obj = {
    age : 20,
    info:function(){
        return ()=>{
            console.log(this.age);
            console.log(this);
        }
    }
}

let info = obj.info()
// info()


let person = {
    age : 30
}


// let info2 = obj.info.call(person)
// let info2 = obj.info.apply(person)
let info2 = obj.info.bind(person)()

// info2()



// function foo() {
//     id:80
//     setTimeout(() => {
//         console.log("id:",this.id);
//         console.log(this);
//     }, 100);
// }

// var id = 100;
// foo({id:50})
// foo.bind({id:40})(this)



// 函数的尾调用

function fn(x) {
    console.log("hello", x);
}

function fn1(y) {
    return fn(y)  //尾调用
}

fn1("tom")

</script>
</html>